package com.itheima.web;

import com.itheima.common.R;
import io.swagger.annotations.Api;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.UUID;

/*
    用来处理文件上传和下载
     1. 文件上传
        1.1 定义方法，参数里面设置一个MultipartFile 类型的参数。
        1.2 参数名不能乱写，乱写就收不到文件。要按照页面的name属性的值来写。
            elementui默认情况下前端设置的name，属性值是 ： file
 */
@RestController
@Api(tags = "文件管理模块")
public class FileController {

    //  fileDir: D:/heima130/img
    @Value("${fileDir}")
    private String fileDirPath;

    /**
     * 文件上传
     * @param file 页面上传上来的文件对象
     * @return
     */
    @PostMapping("/common/upload")
    public R upload(MultipartFile file) throws IOException {

        //1. 获取原始的文件名字 123.jpg
        String originalFilename = file.getOriginalFilename();

        //2. 切割出来后缀名 .jpg
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

        //3. 构建一个新的文件名字【UUID】 07a920eaf02d4dbb9684b656d0eb55c6
        String preffix = UUID.randomUUID().toString().replaceAll("-" , "");

        //4. 拼接出来全新的名字 07a920eaf02d4dbb9684b656d0eb55c6.jpg
        String newName = preffix + suffix;

        //5. 构建保存的路径位置，如果不存在，就创建这个路径
        File fileDir = new File(fileDirPath);
        if(!fileDir.exists()){
            fileDir.mkdirs();
        }


        //6. 保存文件到指定位置
        file.transferTo(new File(fileDir , newName ));

        //2. 返回:
        return R.success(newName);
    }

    /**
     * 文件下载
     * @param name
     * @return
     */
    @GetMapping("/common/download")
    public void download(String name , HttpServletResponse resp) throws Exception {

        //构建文件的位置指向
        String file = fileDirPath + name;

        //1.构建一个输出流，输出给客户端
        FileInputStream fis = new FileInputStream(file);

        //2. 输入流和输出流对接
        ServletOutputStream os = resp.getOutputStream();

        //3. 对接io
        IOUtils.copy(fis, os);

        /*byte [] buffer = new byte[1024];
        int len = 0 ;
        while( (len = fis.read(buffer)) != -1 ){
            os.write(buffer , 0 , len);
        }

        os.close();
        fis.close();*/

    }
}
